import { Message } from 'element-ui'
// 1.引入axios(基于axios封装)
import Axios from 'axios'
import store from '@/store'
import { getTimeStamp } from './auth'
import router from '@/router'
const stamp = 5 * 1000
// 2.创建请求实例
const service = Axios.create({
  // 相当于是  '/api',如果baseurl没有设置协议，域名，默认是往localhost:端口发请求
  baseURL: process.env.VUE_APP_BASE_API,
  timeout: 15 * 1000
})
// 3.配置拦截器interceptors：请求拦截器+相应拦截器
// 配置请求可以发送，请求不能发送
service.interceptors.request.use(config => {
  console.log(config)
  // 给config添加headers属性
  // 方法一
  // config.headers['Authorization'] = `Bearer ${store.getters.token}`
  // 方法二
  // 判断是否登录，判断有无token
  if (store.getters.token) {
    // 判断token是否超时
    if (isCheckTimeOut()) {
      // 1.清空token
      store.dispatch('user/logout')
      // 2.跳转登录页
      router.push('/login')
      // 3.提示用户
      return Promise.reject(new Error('token超时了'))
    } else {
      config.headers.Authorization = `Bearer ${store.getters.token}`
    }
  }
  // 一定要return config,如果不return  无法发送请求
  return config
}, error => {
  // 返回一个失败的状态，这个时候就相当于后台接口报错了，那么会进入响应拦截器进行相应的提示
  return Promise.reject(error)
})
// 配置成功和失败的两个处理方法
service.interceptors.response.use(res => {
  // axios默认会添加一层data，所以是从res.data里面解构
  const { success, message, data } = res.data
  // 判断业务是否处理成功
  if (success) {
  // 如果处理成功，返回数据
    return data
  } else {
  // 如果处理失败，提示错误信息，返回错误对象(promise)
    Message.error(message)
    return Promise.reject(new Error(message))
  }
}, err => {
  if (err?.response?.data?.code === 10002) {
    // 超时  -> 1.清token 2.跳页面
    store.dispatch('user/logout')
    router.push('/login')
  } else {
    // 提示错误信息，返回错误对象(promise)
    Message.error(err.message)
  }
  return Promise.reject(err)
})
function isCheckTimeOut() {
// token超时    当前时间   -    记录时间  >   自定时间长度
  var currentTime = +new Date()
  var timeStamp = getTimeStamp()
  return currentTime - timeStamp > stamp
}
// 4.导出创建的示例
export default service
